#ifndef CAPPACKET_H
#define CAPPACKET_H
#include <QThread>
//#include <sys/time.h>
//#include <unistd.h>
#include "pcap.h"
#include "projectdb.h"
#include "stdafx.h"

#include <QStandardItemModel>

class CapPacket:public QThread
{
    Q_OBJECT
public:
   // CapPacket(MainWindow *parent);
    CapPacket();
    virtual void run();

    int harmonicOrder;

private:

        // 采样初始化参数
        //==============================================================================
    pcap_t* m_fp;				// 打开抓包连接的句柄
    QString m_sGuiYueType;		// 规约类型
    int m_iFirstSmpCnt_Start;	// 第一个ASDU的采样计数的起始位置
    int m_iSmpCnt_Length;		// 采样计数长度
    int m_iASDU_Cnt;			// 一个APDU内ASUD的总数
    int m_iASDU_Start;			// 一个包内第一个ASDU的起始下标
    int m_iAPDU_Start;			// 一个包内APDU的起始下标
    int m_iASDU_Length;			// ASDU的长度
    int m_iFirstData_Start;		// 一个ASDU内 0 通道的数据起始位置
    int m_iData_Length;			// 数据位长度：9-1规约为2，9-2规约为4
    int m_iTongDao;				// 采样通道
    int m_iTongDao_Length;		// 数据通道长度
    int m_iSmpRate;				// 采样速率
    double m_dblFuZhi;				// 幅值：9-1 为11585， 9-2 待定
    bool m_bInitCapPara;		// 初始化抓包参数成功标志
    int m_iTongDaoCount;		// 数据通道总数
    int m_iTongDatCountReal;	// 数据通道总数（实际值）
    int	m_iStartPoint;			// 采样起始SmpCnt值
    int m_iTestedPoints;		// 已获得测量点，用于标记绘图曲线的下标
    bool m_bSamplingPoints;		// 采点过程启动中
    bool m_bStopCap;			// 立即停止标志
    int m_iZhouQi;		// 采样周期
    int m_Sync;                     //采样同步
    int m_iSync_Start;		// 一个ASDU内采样同步的数据位置
    int m_iMacGl;           //mac过滤标志 0不过滤，1过滤
    int CYPL;
    bool m_bCapIsNoError;
    int m_iTongDaoReal;
    QString APPID;
    QString MAC;
    QString m_sFileLuboName;
    void getSysLoad();

 //   double **m_PointArray;	// 绘图点数组
    bool m_bIsChannelShow[TONGDAOCOUNT];
 //   int *m_SmpCntArray;	// 数字量数组
  //  QPointF *m_TstChannelPs;	// 被测通道绘图点，用于绘制标准曲线

    int m_iShuZiLiangMax;			// 数字量最大值
    int m_iShuZiLiangMax_Temp;		// 数字量最大值_临时

    bool m_bIsStandardPort;			// 是否是标准端口，以决定标准采样速率9-2

    QString m_sAnalyseResult;	// 解析包结果存放字符串

    ProjectDB *myDB;			// 全局数据库管理类指针

    double m_dblSin;			// 实部
    double m_dblCos;			// 虚部
    int m_iZhouQiShu;			// 采样周期数
    double m_dblYouXiaoZhi;		// 互感器基波有效值
    double m_dblXW;				// 互感器所示相位
    int m_iLastSmpcnt;			// 最后一个SmpCnt值
    int m_iPoints;				// 计算公式所包含点数

    bool m_isOK;
    int m_iJs;  //计数器
    int m_iLost;//丢帧数
    bool m_bBegin;//开始标志

    int jsFlag;
 //   double m_szl[5*50*200];
    double dblMaxJg;
    double dblMinJg;
    int iSuanFa;
    int m_iType;   //1:MU延时时间;2:其他
    int testSelect;
    int xieboNum;
    int m_iCyfs;        //采样方式

    typedef struct _Muinfo
    {
        QString mac;
        int cypl;
    }s_Muinfo;
    s_Muinfo  Muinfo[100];

    char t_MAC[100][17];
    int t_cypl[100];
    int MuNum;
    int maxSmpCnt;

public:
  //  struct timeval startm;
  //  struct timeval endm;
  //  struct timespec time_start,time_end;
    void init();
    double startm,endm;

  //  double m_PointArray[12][ZHOUQI*200];	// 绘图点数组
    double m_PointArray[12][80*50*10];
    double m_tempArray[12][80*50*10];

    QString AnalyseResult(){return m_sAnalyseResult;}
    bool getIsOK(){return m_isOK;}
    void setIsOK(bool value){m_isOK=value;}
    int getPoint(){return m_iZhouQi * m_iSmpRate;}
    int getMaxShuZiLiang(){return m_iShuZiLiangMax;}
    bool IsOpen(){return m_bInitCapPara;}
    QString GuiYueType(){return m_sGuiYueType;}
    int SmpRate(){return m_iSmpRate;}
    void setSmpRate(int value){m_iSmpRate=value;}
    int getTestChannel(){return m_iTongDao;}
    void setTestChannel(int Value){m_iTongDao = Value;}
    int ChannelCnt(){return m_iTongDaoCount;}		// 通道总数

    void StopCap(bool Value){m_bStopCap = Value;}
    int TestedPoints(){return m_iTestedPoints;}
    void IsStandardPort(bool bValue){m_bIsStandardPort = bValue;}
    void setTestType(int value){testType=value;}
    int getSync(){return m_Sync;}
    void setTestSelect(int value){testSelect=value;}
    void setXieboNum(int value){xieboNum=value;}
    void setiType(int value){m_iType=value;}
    void setCyfs(int value){m_iCyfs=value;}

    double getMaxJg(){return dblMaxJg;}
    double getMinJg(){return dblMinJg;}

    void setMacGl(int value){m_iMacGl=value;}
    QString getLbFileName(){return m_sFileLuboName;}

    bool makeSmvModle(const u_char* pkt_data, int pkt_len);

    // 获得相位值
    double XiangWei(){ return m_dblXW;}
    // 获得有效值
    double YouXiaoZhi()
    {
        double dblYXZ = m_dblYouXiaoZhi;
     //   m_dblYouXiaoZhi = 0;
        return dblYXZ;
    }
    int ZhouQi(){return m_iZhouQiShu;}
    double FuZhi(){return m_dblFuZhi;}
    void setSuanFa(int value){iSuanFa=value;}
public:
    QStandardItemModel *show_protocol;
    QString show_packet;
    void pcap_openFile(QString);
    void freeData();
    // 设置9-1规约的解析包参数
    bool SetCapPara_91(const u_char* pkt_data, int pkt_len);
    // 设置9-1规约的解析包参数
    bool SetCapPara_92(const u_char* pkt_data, int pkt_len);
    // 设置Goose规约的解析包参数
    bool SetCapPara_Goose(const u_char* pkt_data, int pkt_len);
    // 捕获下一个包
    bool CapNextPkt(void);
    // 设置抓包和处理数据的参数
    bool SetCapParamater(int iTongDao, int iZhouQi, int iSmpCntStart, double dblFuZhi);
    // 关闭网口
    bool Close(void);

    void SetChannelShow(int iIndex, bool bIsShow){m_bIsChannelShow[iIndex]=bIsShow;}
    bool GetChannelShow(int iIndex){return m_bIsChannelShow[iIndex];}
    bool Open(int);
    // 清空缓冲池中的数据
    void ClearPksPool(void);
    // 获得最大数字量
    double getMaxPointValue(void);
    QString getHexFormat(int iValue);

    int getLost(){return m_iLost;}
    void harmonic(double *s,int M,int len,int fs) ;
    bool FindAll();

    void pcap_lubo();
    void pcap_stopLubo();
    bool myLubo(void);
    bool showAll(void);

signals:
        void sigJswc();
        void sigCyOver();
        void sigFind(QString,QString,QString,int,int);

private slots:
        void cappacketIsReady(){ emit sigJswc();}

private:
    int testType;   //0:常规测量;1:扫描列表
 //   MainWindow *parent;
    void setJqxs();
    double ti[65535];
//    pcap_t *descr;
     pcap_dumper_t *dumpfile;
    bool luboIsEnd;
};

#endif // CAPPACKET_H
